package com.decoration.basic.interceptor;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@SuppressWarnings("deprecation")
@Configuration
//web配置文件（web.xml）添加一个拦截器
public class SessionConfiguration extends WebMvcConfigurerAdapter {

	@Bean
	public ApiInterceptor getApiInterceptor() {
		return new ApiInterceptor();
	}

	@Override
	public void addInterceptors(InterceptorRegistry registry) {
//		registry.addInterceptor(new ApiInterceptor()).addPathPatterns("/");
		// 网站配置生成器：添加一个拦截器，拦截路径为整个项目
		// 所有已api开头的访问都要进入RedisSessionInterceptor拦截器进行登录验证，并排除login接口(全路径)。必须写成链式，分别设置的话会创建多个拦截器。
		// 必须写成getSessionInterceptor()，否则SessionInterceptor中的@Autowired会无效
//		registry.addInterceptor().addPathPatterns("/api/**").excludePathPatterns();
//		super.addInterceptors(registry);
		InterceptorRegistration registration = registry.addInterceptor(getApiInterceptor());
		registration.addPathPatterns("/**"); // 所有路径都被拦截
		// 添加不拦截路径
		registration.excludePathPatterns("/api/user/login", // 前端登录
				"/api/caselist", // 案例列表
				"/api/casebyid", // 案例详情
				"/admin/user/login" // 后端登陆
		);
	}

	/**
	 * 就是注册的过程，注册Cors协议的内容。 如： Cors协议支持哪些请求URL，支持哪些请求类型，请求时处理的超时时长是什么等。
	 * 
	 * @param registry - 就是用于注册Cros协议内容的一个注册器。
	 */
	@Override
	public void addCorsMappings(CorsRegistry registry) {
		registry.addMapping("/**")// 所有的当前站点的请求地址，都支持跨域访问。
				.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") // 当前站点支持的跨域请求类型是什么。
				.allowCredentials(true) // 是否支持跨域用户凭证
				.allowedHeaders("*").allowedOriginPatterns("*") // 所有的外部域都可跨域访问。
				// 如果是localhost则很难配置，因为在跨域请求的时候，外部域的解析可能是localhost、127.0.0.1、主机名
				.maxAge(3600); // 超时时长设置为1小时。 时间单位是秒。
	}

}
